package com.hjh.permission

import android.annotation.SuppressLint
import android.content.Context
import android.os.Build
import com.hjq.permissions.OnPermissionCallback
import com.hjq.permissions.Permission
import com.hjq.permissions.XXPermissions
import kotlin.apply

/**
 * @author： hjh
 * @createDate： 2025/6/12 10:42
 * @description：权限请求工具类，适配 Android 6.0 ~ 14+
 * @qq： 3472903821
 * @version: 1.0
 */
object PermissionUtil {

    /**
     * 统一请求权限方法
     *
     * @param context       当前上下文，可以是 Activity、Service、ApplicationContext
     * @param storage       是否请求 Android 11+ 的“所有文件访问权限”
     * @param readStorage   是否请求读外部存储权限（Android 6~10）
     * @param writeStorage  是否请求写外部存储权限（Android 6~10）
     * @param location      是否请求精确位置权限
     * @param backgroundLocation 是否请求后台位置权限（Android 10+）
     * @param camera        是否请求相机权限
     * @param audio         是否请求录音权限
     * @param phoneState    是否请求读取设备状态权限
     * @param phoneNumbers  是否请求读取电话号码权限
     * @param readContacts  是否请求读取联系人权限
     * @param writeContacts 是否请求写联系人权限
     * @param sendSms       是否请求发送短信权限
     * @param receiveSms    是否请求接收短信权限
     * @param readSms       是否请求读取短信权限
     * @param readCalendar  是否请求读取日历权限
     * @param writeCalendar 是否请求写日历权限
     * @param bodySensors   是否请求访问身体传感器权限
     * @param bluetoothScan 是否请求蓝牙扫描权限（Android 12+）
     * @param bluetoothConnect 是否请求蓝牙连接权限（Android 12+）
     * @param postNotifications 是否请求发送通知权限（Android 13+）
     * @param onGranted     所有权限被授予时的回调
     * @param onDenied      部分或全部权限被拒绝时的回调，带有被拒权限列表
     */
    @SuppressLint("ObsoleteSdkInt")
    fun request(
        context: Context,
        storage: Boolean = false,
        readStorage: Boolean = false,
        writeStorage: Boolean = false,
        location: Boolean = false,
        backgroundLocation: Boolean = false,
        camera: Boolean = false,
        audio: Boolean = false,
        phoneState: Boolean = false,
        phoneNumbers: Boolean = false,
        readContacts: Boolean = false,
        writeContacts: Boolean = false,
        sendSms: Boolean = false,
        receiveSms: Boolean = false,
        readSms: Boolean = false,
        readCalendar: Boolean = false,
        writeCalendar: Boolean = false,
        bodySensors: Boolean = false,
        bluetoothScan: Boolean = false,
        bluetoothConnect: Boolean = false,
        postNotifications: Boolean = false,
        onGranted: (() -> Unit)? = null,
        onDenied: ((denied: MutableList<String>) -> Unit)? = null
    ) {
        // 动态构建需要请求的权限列表，根据不同 Android 版本控制权限
        val permissions = mutableListOf<String>().apply {
            // Android 11及以上请求“所有文件访问权限”
            if (storage && Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
                add(Permission.MANAGE_EXTERNAL_STORAGE)
            }
            // Android 6~10 请求读写外部存储权限
            if ((readStorage || writeStorage) && Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
                if (readStorage) add(Permission.READ_EXTERNAL_STORAGE)
                if (writeStorage) add(Permission.WRITE_EXTERNAL_STORAGE)
            }
            // 位置权限
            if (location) add(Permission.ACCESS_FINE_LOCATION)
            // Android 10及以上后台位置权限
            if (backgroundLocation && Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                add(Permission.ACCESS_BACKGROUND_LOCATION)
            }
            // 其他常用权限
            if (camera) add(Permission.CAMERA)
            if (audio) add(Permission.RECORD_AUDIO)
            if (phoneState) add(Permission.READ_PHONE_STATE)
            if (phoneNumbers) add(Permission.READ_PHONE_NUMBERS)
            if (readContacts) add(Permission.READ_CONTACTS)
            if (writeContacts) add(Permission.WRITE_CONTACTS)
            if (sendSms) add(Permission.SEND_SMS)
            if (receiveSms) add(Permission.RECEIVE_SMS)
            if (readSms) add(Permission.READ_SMS)
            if (readCalendar) add(Permission.READ_CALENDAR)
            if (writeCalendar) add(Permission.WRITE_CALENDAR)
            if (bodySensors) add(Permission.BODY_SENSORS)
            // Android 12及以上蓝牙权限
            if (bluetoothScan && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
                add(Permission.BLUETOOTH_SCAN)
            }
            if (bluetoothConnect && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
                add(Permission.BLUETOOTH_CONNECT)
            }
            // Android 13及以上推送通知权限
            if (postNotifications && Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
                add(Permission.POST_NOTIFICATIONS)
            }
        }

        // 如果没有权限需要请求，直接执行成功回调
        if (permissions.isEmpty()) {
            onGranted?.invoke()
            return
        }

        // 使用 XXPermissions 请求权限
        XXPermissions.with(context)
            .permission(permissions)
            .interceptor(PermissionInterceptor())    // 可选，自定义权限请求拦截器
            .description(PermissionDescription())    // 可选，自定义权限描述提示
            .request(object : OnPermissionCallback {
                // 所有权限授权成功
                override fun onGranted(requestPermissions: MutableList<String>, allGranted: Boolean) {
                    if (allGranted) {
                        onGranted?.invoke()
                    }
                }

                // 权限被拒绝处理
                override fun onDenied(deniedPermissions: MutableList<String>, doNotAskAgain: Boolean) {
                    onDenied?.invoke(deniedPermissions)
                }
            })
    }
}